<?php
/**
 * Modelo de Listagem de tabelas relacionadas
 * Recuperar os dados de uma entidade com dados espalhados em várias tabelas relacionadas
 * 
 * @example Recuperar os dados de uma tabela de imagens e o nome da categoria e o nome da galeria
 * @author Emanuel Melo e Renato Lenz @ PC4 Team
 */
class PC4_Crud_Tabelas extends PC4_Crud_Abstrato {
	
	public $tabelas, $campoId;
	/**
	 * Construtor
	 * @param $tabela
	 * @param $tabelas - tabelas: {tabela: {'campos: {alias: nome_campo}, 'join': left, 'pk': tabela.campo, 'fk': tabela.campo}}
	 * @param $validacoes
	 */
	function __construct($tabela, $tabelas = array(), $campoId = 'id', $validacoes = array()) {
		parent::__construct($tabela, $validacoes);
		$this->tabelas = $tabelas;
		$this->campoId = $campoId;
	}
	
	function lista($pagina = 1, $limite = -1, $debug = false) {
		$this->db->select($this->letra . '.*');
		foreach ($this->tabelas as $tabela => $infos) {
			$c++;
			// O espaço que separa o nome da tabela do alias
			$posEspaco = strrpos($tabela, ' ');
			if (($posEspaco === false)) {
				$aliasTabela = ' tb' . $c;
			}
			else {
				$aliasTabela = substr($tabela, $posEspaco + 1);
				$tabela = substr($tabela, 0, $posEspaco);
			}
			if (empty($infos['join'])) {
				$infos['join'] = 'inner';
			}
			foreach ((array)$infos['campos'] as $alias => $campo) {
				if (is_numeric($alias)) {
					$alias = end(explode('.', $campo)) . ucfirst($tabela);
				}
				if (strpos($campo, '.') === false) {
					$campo = $aliasTabela . '.' . $campo;
				}
				$this->db->select($campo . ' AS ' . $alias, false);
			}
	    	$this->db->join($tabela . ' ' . $aliasTabela, $infos['pk'] . ' = ' . $infos['fk'], $infos['join']);
		}
    	return parent::lista($pagina, $limite, $debug);
	}

}
?>